home *** CD-ROM | disk | FTP | other *** search
/ MASPC 1 / MASPC_1.iso / Demos / Demo DIV / DATA / PRG / JUEGOS / FOSTIATO.PRG < prev    next >
Encoding:
Text File  |  1997-12-01  |  54.8 KB  |  1,448 lines

  1.  
  2. //------------------------------------------------------------------------------
  3. // TITULO:      FOSTIATOR
  4. // AUTOR:       DANIEL NAVARRO
  5. // FECHA:       15/06/97
  6. //------------------------------------------------------------------------------
  7. PROGRAM fostiator;
  8.  
  9. CONST
  10.     // Distintos estados de los muñecos
  11.     _parado=0;
  12.     _avanzando=1;
  13.     _retrocediendo=2;
  14.     _agachándose=3;
  15.     _agachado=4;
  16.     _levantándose=5;
  17.     _saltando=6;
  18.     _golpe_bajo=7;
  19.     _puñetazo=8;
  20.     _patada_giratoria=9;
  21.     _patada_normal=10;
  22.     _patada_aérea=11;
  23.     _tocado=12;
  24.     _muerto=13;
  25.  
  26.     // Distintas posiciones de los muñecos
  27.     saltar=0;
  28.     agacharse=1;
  29.     avanzar=2;
  30.     retroceder=3;
  31.     golpear=4;
  32.  
  33.     // Tipo de control del muñeco
  34.     control_teclado1=1;
  35.     control_teclado2=2;
  36.     control_ordenador=0;
  37.  
  38.     default_fps=24; // Numero de imágenes por segundo
  39.  
  40. GLOBAL
  41.     // Secuencia de animacin de cada uno de los estados de los muñecos
  42.     anim0[]=1,1,1,14,14,15,15,16,16,17,17,17,16,16,15,15,14,14;
  43.     anim1[]=1,2,3,4,5,6,7,8;
  44.     anim2[]=1,8,7,6,5,4,3,2;
  45.     anim3[]=8,9,10,11,12,13;
  46.     anim4[]=13;
  47.     anim5[]=13,12,11,10,9,8;
  48.     anim6[]=18,19,20,21,21,22,22,22,22,23,23,23,23,24,24,24,24,24,24,24,24;
  49.     anim7[]=52,54,54,54,54,53,53,52,51;
  50.     anim8[]=25,26,27,28,28,28,28,27,27,26,25;
  51.     anim9[]=29,30,31,32,33,33,34,35,36,37,38,39;
  52.     anim10[]=29,30,31,32,32,32,31,31,30,30,29;
  53.     anim11[]=18,19,20,21,21,22,22,24,40,41,41,41,41,41,41,41,41,41,41,41,41,41;
  54.     anim12[]=1,42,42,43,43,42,42;
  55.     anim13[]=1,42,42,43,43,44,44,45,45,46,46,47,47,48,48,49,49,50;
  56.  
  57.     s_golpe1;        // Identificadores de sonidos
  58.     s_golpe2;
  59.     s_golpe3;
  60.     s_tocado1;
  61.     s_tocado2;
  62.     s_tocado3;
  63.     s_aire1;
  64.     s_aire2;
  65.     s_aire3;
  66.     s_aire4;
  67.     s_aire5;
  68.     s_muerto;
  69.  
  70.     id_luchador1,id_luchador2;  // Identificador de ambos combatientes
  71.     id_auxiliar;                // Identificador auxiliar
  72.  
  73.     combates1;      // Numero de combates que ha ganado el primero
  74.     combates2;      // Numero de combates que ha ganado el segundo
  75.  
  76.     estado_juego;   // 0-parado, 1-jugando, 2-fin combate
  77.  
  78.     escenario;      // Escenario de lucha 0 / 1
  79.  
  80.     luchador1=1;    // 0-Ripley, 1-Bishop, 2-Alien, 3-Nostromo
  81.     luchador2=2;    // 0-Ripley, 1-Bishop, 2-Alien, 3-Nostromo
  82.  
  83.     nivel=1;        // Dificultad del juego (0..2)
  84.     modo;           // Modo de juego (ver modos[])
  85.     sangre=1;       // Nivel de sangre (ver sangres[])
  86.  
  87.     // Textos de las opciones de combate
  88.     nombres[]="RIPLEY","BISHOP","ALIEN","NOSTROMO";
  89.     escenarios[]="ESCENARIO 1 : CASTILLO IKA","ESCENARIO 2 : LA CUEVA","ESCENARIO 3: DESIERTO";
  90.     niveles[]="DIFICULTAD : FACIL","DIFICULTAD : NORMAL","DIFICULTAD : DIFICIL";
  91.     modos[]="ORDENADOR contra ORDENADOR"," TECLAS CURSOR contra ORDENADOR",
  92.             "TECLAS QA-RT-X contra ORDENADOR","TECLAS QA-RT-X contra TECLAS CURSOR";
  93.     sangres[]="NIVEL DE SANGRE : NINGUNA","NIVEL DE SANGRE : NORMAL","NIVEL DE SANGRE : EXTASIS";
  94.  
  95.     struct texto[6] // Textos donde se guardan las opciones del combate
  96.         x,y;
  97.         codigo;
  98.     END = 320,480,0,
  99.           320,90,0,
  100.           320,120,0,
  101.           320,150,0,
  102.           100,364,0,
  103.           320,364,0,
  104.           540,364,0;
  105.  
  106.     opción;         // Opción seleccionada del menú
  107.     opción_anterior;
  108.  
  109.     esc_pulsado;    // Indica si se ha abortado con ESC
  110.  
  111.     grises[255]=    // Tabla de conversión de los colores a grises
  112.         0,236,203,220,159,156,155,153,151,150,134,89,90,92,94,94,
  113.         45,46,69,59,103,93,90,134,150,151,155,156,159,220,203,236,
  114.         41,43,46,47,69,59,101,94,40,41,43,43,44,45,46,47,
  115.         40,41,44,45,45,46,47,68,69,58,58,59,58,58,106,101,
  116.         43,45,47,47,47,68,68,68,68,58,59,101,101,101,59,59,
  117.         45,59,101,94,90,90,90,90,90,89,90,90,90,93,94,94,
  118.         69,59,58,106,103,101,101,103,101,101,59,59,94,92,94,93,
  119.         101,94,93,93,94,92,93,89,89,134,134,134,151,150,150,153,
  120.         101,90,89,90,134,134,134,134,134,90,89,134,134,150,150,151,
  121.         103,134,134,134,150,150,150,151,153,153,153,155,156,156,159,159,
  122.         90,89,150,151,153,155,156,219,219,220,223,203,203,203,236,235,
  123.         134,150,150,151,153,153,153,151,155,156,156,159,220,223,236,237,
  124.         134,153,155,156,156,159,219,220,220,201,203,203,201,203,203,236,
  125.         151,155,156,156,219,219,220,159,155,155,159,219,220,219,220,223,
  126.         151,159,153,155,220,220,159,155,223,236,235,235,236,237,238,237,
  127.         155,153,203,223,237,238,247,247,248,247,238,237,235,236,203,220;
  128.  
  129.     sangre_total;   // Partículas de sangre que se han quedado en el mapa
  130.     ángulo_texto;   // Movimiento del texto en las opciones
  131.  
  132. LOCAL
  133.     estado;         // Indicador de la animación actual
  134.     paso;           // Paso de la animación actual
  135.     inc_y,inc_x;    // Desplazamientos del muñeco
  136.     enemigo;        // Identificador del enemigo
  137.     tipo_control;   // Dispositivo que controla al muñeco
  138.     energía;        // Energía de muñeco
  139.  
  140. PRIVATE
  141.     codigo_mapa;    // Pantalla de fondo cargada en ese momento
  142.     codigo_mapa2;
  143.     contador0;      // Contador de uso general
  144.     idtexto;
  145.  
  146. BEGIN
  147.     set_mode(m640x480);     // Selecciona modo de vídeo
  148.     max_process_time=1500;  // Deja más tiempo para que se ejecuten los procesos
  149.     priority=-10;           // Pone muy poca prioridad
  150.  
  151.     intro();                // Ejecuta la intro del juego
  152.     FRAME;                  // Necesario para parar este proceso
  153.     LOOP // Bucle principal
  154.  
  155.         set_fps(100,0);     // Numero de imágenes por segundo
  156.         codigo_mapa=load_map("fostiato\menu.map");  // Carga la pantalla del menú
  157.         load_pal("fostiato\menu.map");
  158.         put_screen(0,codigo_mapa);  // Pone la pantalla del menú
  159.         unload_map(codigo_mapa);    // Y la descarga de memoria para así tener mas
  160.  
  161.         fade_on();          // Enciende la pantalla
  162.  
  163.         opcion=0;           // Inicializa la variable de opciones
  164.  
  165.         WHILE (opcion==0)   // Bucle del menú de presentación
  166.             IF (key(_1) OR
  167.                 key (_enter)) opcion=1; END    // Juego
  168.             IF (key(_2) OR key (_esc)) opcion=2; END    // Salir
  169.             FRAME;
  170.         END
  171.  
  172.         fade_off();             // Apaga la pantalla
  173.  
  174.         IF (opcion==2)          // Opcion elegida: Salir del juego
  175.             créditos();         // Pone los créditos
  176.             signal(id,s_kill);  // Elimina este proceso
  177.             FRAME;              // Y acaba.
  178.         END
  179.  
  180.         // Carga los gráficos de la pantalla de opciones
  181.         codigo_mapa=load_map("fostiato\opciones.map");
  182.         load_pal("fostiato\opciones.map");
  183.         put_screen(0,codigo_mapa);  // Pone el gráfico de fondo
  184.         unload_map(codigo_mapa);    // Descarga el gráfico de memoria
  185.  
  186.         opcion=0;                   // Inicializa la variable de opciones
  187.         ángulo_texto=0;             // Pone a cero el ángulo de desplazamiento del texto seleccionado
  188.         muestra_información();      // Imprime todos los textos y gráficos
  189.         fade_on();                  // Enciende la pantalla
  190.  
  191.         LOOP
  192.             // Mueve el texto que este seleccionado en ese momento
  193.             move_text(texto[opción].codigo,texto[opción].x+get_disty(ángulo_texto,8),texto[opción].y);
  194.             opción_anterior=opcion; // Guarda la opción para no cambiar bruscamente
  195.  
  196.             // Lee las teclas
  197.             IF (key(_right) OR key(_down))
  198.                 opcion++;
  199.             END
  200.             IF (key(_left) OR key(_up))
  201.                 opción--;
  202.             END
  203.  
  204.             // Se ha cambiado a otra opción
  205.             IF (opción<>opción_anterior)
  206.  
  207.                 // Espera a que se pare
  208.                 WHILE (get_disty(ángulo_texto,8)<>0)
  209.                     ángulo_texto+=22500;
  210.                     move_text(texto[opción_anterior].codigo,
  211.                               texto[opción_anterior].x+get_disty(ángulo_texto,8),
  212.                               texto[opción_anterior].y);
  213.                     FRAME;
  214.                 END
  215.  
  216.                 // Normaliza las opciones
  217.                 IF (opcion==7) opcion=0; END
  218.                 IF (opcion==-1) opcion=6; END
  219.  
  220.                 // Espera a soltar la tecla
  221.                 WHILE (key(_right) OR key(_down) OR key(_left) OR key(_up))
  222.                     FRAME;
  223.                 END
  224.             ELSE
  225.                 ángulo_texto+=22500;    // Sigue moviendo el texto
  226.             END
  227.  
  228.             // Se ha elegido una opción
  229.             IF (key(_enter) OR key(_space) OR key (_control))
  230.                 SWITCH(opción)
  231.  
  232.                     // Empieza el juego
  233.                     CASE 0: BREAK; END
  234.  
  235.                     // Modo de juego (1/2 jugadores)
  236.                     CASE 1:
  237.                         modo++;
  238.                         IF (modo==4) modo=0; END
  239.                     END
  240.  
  241.                     // Nivel de juego (Fácil/Difícil)
  242.                     CASE 2:
  243.                         nivel++;
  244.                         IF (nivel==3) nivel=0; END
  245.                     END
  246.  
  247.                     // Nivel de aparición de sangre
  248.                     CASE 3:
  249.                         sangre++;
  250.                         IF (sangre==3) sangre=0; END
  251.                     END
  252.  
  253.                     // Selecciona muñeco del jugador 1
  254.                     CASE 4:
  255.                         luchador1++;
  256.                         IF (luchador1==4) luchador1=0; END
  257.                     END
  258.  
  259.                     // Selecciona el escenario
  260.                     CASE 5:
  261.                         escenario++;
  262.                         IF (escenario==3) escenario=0; END
  263.                     END
  264.  
  265.                     // Selecciona muñeco del jugador 2
  266.                     CASE 6:
  267.                         luchador2++;
  268.                         IF (luchador2==4) luchador2=0; END
  269.                     END
  270.                 END
  271.                 muestra_información();  // Actualiza la información de pantalla
  272.                 WHILE (key(_enter) OR key(_space) OR key (_control)) // Espera a soltar la tecla
  273.                     FRAME;
  274.                 END
  275.             END
  276.             IF (key(_esc))    // Se ha pulsado 'escape'
  277.                 esc_pulsado=1;// Pone variable a 1 la variable de escape pulsado
  278.                 BREAK;        // Y sale del bucle
  279.             END
  280.             FRAME;
  281.         END
  282.  
  283.         IF (esc_pulsado)    // Sale del menú de opciones si se pulso escape
  284.             esc_pulsado=0;  // Pone a a cero la variable para la proxima vez
  285.             fade_off();     // Apaga la pantalla
  286.             let_me_alone(); // Deja unicamente el proceso principal(este)
  287.             delete_text(all_text);//Borra cualquier texto que hubiera
  288.             CONTINUE;       // Sale del siguiente bucle
  289.         END
  290.         // Carga los gráficos necesarios para el escenario elegido
  291.         SWITCH (escenario)
  292.             CASE 0:
  293.                 codigo_mapa=load_map("fostiato\fondo1.map");
  294.                 codigo_mapa2=load_map("fostiato\paisaje1.map");
  295.             END
  296.             CASE 1:
  297.                 codigo_mapa=load_map("fostiato\fondo2.map");
  298.                 codigo_mapa2=load_map("fostiato\paisaje2.map");
  299.             END
  300.             CASE 2:
  301.                 codigo_mapa=load_map("fostiato\fondo3.map");
  302.                 codigo_mapa2=load_map("fostiato\paisaje1.map");
  303.             END
  304.         END
  305.  
  306.         // Carga los gráficos necesarios para el jugador 1
  307.         SWITCH(luchador1)
  308.             CASE 0: load_fpg("fostiato\mujer.fpg"); END
  309.             CASE 1: load_fpg("fostiato\hombre1.fpg"); END
  310.             CASE 2: load_fpg("fostiato\esquelet.fpg"); END
  311.             CASE 3: load_fpg("fostiato\hombre2.fpg"); END
  312.         END
  313.  
  314.         // Carga los gráficos necesarios para el jugador 2
  315.         SWITCH(luchador2)
  316.             CASE 0: load_fpg("fostiato\mujer.fpg"); END
  317.             CASE 1: load_fpg("fostiato\hombre1.fpg"); END
  318.             CASE 2: load_fpg("fostiato\esquelet.fpg"); END
  319.             CASE 3: load_fpg("fostiato\hombre2.fpg"); END
  320.         END
  321.  
  322.         // Si los jugadores son iguales convierte uno de ellos a grises
  323.         IF (luchador1==luchador2)
  324.             FROM contador0=1 TO 54;
  325.                 // Cambia los 54 primeros gráficos del fichero
  326.                 // a la paleta de grises
  327.                 convert_palette(2,contador0,&grises);
  328.             END
  329.             convert_palette(2,100,&grises);// También convierte los gráficos
  330.             convert_palette(2,101,&grises);// pequeños de las carras
  331.         END
  332.  
  333.         combates1=0;    // Inicializa las variables del juego
  334.         combates2=0;
  335.         sangre_total=0;
  336.  
  337.         REPEAT          // Bucle del juego
  338.  
  339.             fade_off(); // Apaga la pantalla
  340.  
  341.             // Borra los textos, procesos  o 'scrolles' que hubiera abiertos
  342.             let_me_alone();
  343.             delete_text(all_text);
  344.             stop_scroll(0);
  345.             clear_screen();
  346.  
  347.             // Selecciona el numero de pantallas por segundo y el tipo de restauración
  348.             set_fps(100,0);
  349.             restore_type=complete_restore;
  350.  
  351.             // Pone la pantalla a blanco
  352.             fade(200,200,200,8);
  353.             WHILE (fading) FRAME; END //Espera mientras enciende la pantalla
  354.  
  355.             // Cambia el tipo de restauración de pantalla para ganar velocidad
  356.             restore_type=no_restore;
  357.  
  358.             estado_juego=0; // Para el juego para poner todo
  359.  
  360.             // Inicializa el scroll
  361.             start_scroll(0,0,codigo_mapa,codigo_mapa2,0,0);
  362.             scroll.x0=160;
  363.  
  364.             // Crea los muñecos  que se han seleccionado
  365.             // y el tipo de control de los mismos
  366.             SWITCH(modo)
  367.  
  368.                 // Ordenador contra ordenador
  369.                 CASE 0:
  370.                     id_luchador1=muñeco(260,440,1,1,control_ordenador,luchador1);
  371.                     id_luchador2=muñeco(700,440,2,0,control_ordenador,luchador2);
  372.                 END
  373.  
  374.                 // Jugador contra ordenador
  375.                 CASE 1:
  376.                     id_luchador1=muñeco(260,440,1,1,control_teclado1,luchador1);
  377.                     id_luchador2=muñeco(700,440,2,0,control_ordenador,luchador2);
  378.                 END
  379.  
  380.                 // Ordenador contra jugador
  381.                 CASE 2:
  382.                     id_luchador1=muñeco(260,440,1,1,control_teclado2,luchador1);
  383.                     id_luchador2=muñeco(700,440,2,0,control_ordenador,luchador2);
  384.                 END
  385.  
  386.                 // Jugador contra jugador
  387.                 CASE 3:
  388.                     id_luchador1=muñeco(260,440,1,1,control_teclado2,luchador1);
  389.                     id_luchador2=muñeco(700,440,2,0,control_teclado1,luchador2);
  390.                 END
  391.             END
  392.  
  393.             // Inicializa las variables enemigo de los muñecos que son
  394.             // identificadores al proceso del enemigo
  395.             id_luchador1.enemigo=id_luchador2;
  396.             id_luchador2.enemigo=id_luchador1;
  397.  
  398.             objetos(0,320,49,200,0,0); // Pone los marcadores de energía
  399.             objetos(0,194,38,201,0,1);
  400.             objetos(0,446,38,202,0,2);
  401.  
  402.             define_region(1,0,0,640,480);   // Define las regiones para el movimiento
  403.             define_region(2,0,0,640,480);   // de pantalla
  404.  
  405.             // Escribe el nombre del escenario
  406.             write(1,320,0,1,escenarios[escenario]);
  407.  
  408.             // Pone las fotos y los nombres de los muñecos
  409.             objetos(id_luchador1.file,44,52,100+combates2,1,0);
  410.             write(1,45,100,1,nombres[luchador1]);
  411.             objetos(id_luchador2.file,596,52,100+combates1,0,0);
  412.             write(1,596,100,1,nombres[luchador2]);
  413.  
  414.             // Crea las estrellas que marcan los combates ganados
  415.             crea_estrellas();
  416.  
  417.             // Pone el mensaje de inicio de combate
  418.             SWITCH(combates1+combates2)
  419.                 CASE 0:
  420.                     idtexto=write(2,320,200,4,"ASALTO 1");
  421.                 END
  422.                 CASE 1:
  423.                     idtexto=write(2,320,200,4,"ASALTO 2");
  424.                 END
  425.                 CASE 2:
  426.                     idtexto=write(2,320,200,4,"ASALTO 3");
  427.                 END
  428.             END
  429.  
  430.             fade(100,100,100,10);       // Muestra la pantalla
  431.             WHILE (fading) FRAME; END
  432.  
  433.             // Dependiendo del nivel el juego va mas o menos rápido
  434.             set_fps(default_fps+nivel*2,8);
  435.             FRAME(4800);    // Hace una pequeña pausa
  436.  
  437.             // Borra el texto de inicio de combate
  438.             delete_text(idtexto);
  439.  
  440.             estado_juego=1;             // Quita la pausa al juego
  441.  
  442.             REPEAT  // Bucle de cada combate
  443.  
  444.                 // Coloca el scroll dependiendo de las posiciones de los luchadores
  445.                 scroll.x0=(id_luchador1.x+id_luchador2.x)/4-80;
  446.                 FRAME;
  447.  
  448.                 // Actualiza los marcadores
  449.                 define_region(1,296-id_luchador1.energia,28,id_luchador1.energia+1,20);
  450.                 define_region(2,345,29,id_luchador2.energia+1,20);
  451.  
  452.                 // Comprueba si se ha pulsado 'escape'
  453.                 IF (key(_esc)) esc_pulsado=1; END
  454.  
  455.             // Repite hasta que se pulse escape o gane algun luchador
  456.             UNTIL (estado_juego==2 OR esc_pulsado)
  457.  
  458.             // Si no se ha pulsado escape es que alguno ha ganada
  459.             IF (NOT esc_pulsado)
  460.                 IF (id_luchador1.energia==0) // Gana el jugador 2
  461.                     combates2++;
  462.                 ELSE
  463.                     combates1++;            // Gana el jugador 1
  464.                 END
  465.                 crea_estrellas();   // Actualiza las estrellas
  466.                 FRAME(4800);
  467.             END
  468.  
  469.         // Repite hasta que algun jugador gane dos combates
  470.         UNTIL (combates1==2 OR combates2==2 OR esc_pulsado)
  471.  
  472.         // Si no se ha pulsado 'escape' pon el final de la lucha
  473.         IF (NOT esc_pulsado)
  474.  
  475.             // Pon el numero de imágenes por segundo como en el menú
  476.             set_fps(100,0);
  477.  
  478.             fade(200,200,200,10);       // Pone la pantalla a blanco
  479.             WHILE (fading) FRAME; END   // Espera hasta que se ponga blanca
  480.  
  481.             // Pone el nombre del que ha ganado
  482.             IF (combates1==2)
  483.                 write(2,320,160,4,nombres[luchador1]);
  484.             ELSE
  485.                 write(2,320,160,4,nombres[luchador2]);
  486.             END
  487.  
  488.             // Y el mensaje de gana
  489.             write(2,320,220,4,"GANA");
  490.  
  491.             fade(100,100,100,10);       // Enciende pantalla
  492.             WHILE (fading) FRAME; END   // Espera hasta que se encienda
  493.  
  494.             // Pone el numero de imágenes por segundo como en el juego
  495.             set_fps(default_fps+nivel*2,8);
  496.  
  497.             FRAME(9600);                // Espera un rato
  498.  
  499.         ELSE
  500.             // Actualiza la variable que guarda la pulsación de 'escape'
  501.             esc_pulsado=0;
  502.         END
  503.  
  504.         fade_off(); // Apaga la pantalla
  505.  
  506.         // Inicializa todo, borra procesos, textos pendientes, scrolles, etc
  507.         stop_scroll(0);             // Para scroll
  508.         unload_fpg(1);              // Descarga ficheros de gráficos
  509.         unload_fpg(2);
  510.         unload_map(codigo_mapa);    // Descarga mapas gráficos
  511.         unload_map(codigo_mapa2);
  512.         let_me_alone();             // Borra procesos
  513.         delete_text(all_text);      // Borra textos
  514.  
  515.         // Cambia la forma de restaurar la pantalla
  516.         restore_type=complete_restore;
  517.  
  518.     END
  519. END
  520.  
  521. //------------------------------------------------------------------------------
  522. // Proceso muestra_informacion
  523. // Pone los textos y los gráficos de la pantalla de opciones
  524. //------------------------------------------------------------------------------
  525.  
  526. PROCESS muestra_información()
  527.  
  528. BEGIN
  529.     // Borra todo para luego imprimirlo actualizado
  530.     delete_text(all_text);  // Borra cualquier texto pendiente
  531.  
  532.     signal(id_luchador1,s_kill);     // Elimina los procesos de los muñecos
  533.     signal(id_luchador2,s_kill);
  534.     signal(id_auxiliar,s_kill);
  535.  
  536.     // Pone los textos no seleccionables
  537.     write(2,320,0,1,"OPCIONES");
  538.     write(2,320,156,1,"CONTRA");
  539.  
  540.     // Pone textos seleccionables
  541.     texto[0].codigo=write(2,320,480,7,"EMPEZAR JUEGO");
  542.     texto[1].codigo=write(1,320,90,1,modos[modo]);
  543.     texto[2].codigo=write(1,320,120,1,niveles[nivel]);
  544.     texto[3].codigo=write(1,320,150,1,sangres[sangre]);
  545.  
  546.     // Pone los gráficos de los muñecos y del escenario elegidos
  547.     id_luchador1=objetos(0,100,256,310+luchador1,1,0);
  548.     id_luchador2=objetos(0,540,256,310+luchador2,0,0);
  549.     id_auxiliar=objetos(0,320,300,300+escenario,0,0);
  550.  
  551.     // Pone los textos de los muñecos y del escenario elegido
  552.     texto[4].codigo=write(1,100,364,1,nombres[luchador1]);
  553.     texto[5].codigo=write(1,320,364,1,escenarios[escenario]);
  554.     texto[6].codigo=write(1,540,364,1,nombres[luchador2]);
  555.  
  556.     // Mueve el texto que esta seleccionado
  557.     move_text(texto[opción].codigo,
  558.               texto[opción].x+get_disty(ángulo_texto,8),
  559.               texto[opción].y);
  560. END
  561.  
  562. //------------------------------------------------------------------------------
  563. // Proceso control
  564. // Mueve los muñecos, bien por teclado o controlados por el ordenador
  565. // Entradas: 'acción'   : Acción ha comprobar si se hace
  566. //------------------------------------------------------------------------------
  567.  
  568. PROCESS control(acción)
  569.  
  570. PRIVATE
  571.     dist;   // Distancia entre los muñecos
  572.  
  573. BEGIN
  574.  
  575.     // Comprueba que el juego no este en pausa
  576.     IF (estado_juego<>1) return(0); END
  577.  
  578.     // Lee la tecla dependiendo del tipo de control
  579.     SWITCH(father.tipo_control)     // Mira quien maneja el muñeco
  580.  
  581.         CASE control_teclado1:      // Si se controla con el teclado1
  582.  
  583.             // Va mirando que acción se quiere hacer
  584.             // Y leyendo las teclas que se usan para ello
  585.             SWITCH(acción)          // Mira que acción se esta comprobando
  586.                 CASE saltar:
  587.                     RETURN(key(_up));   // Devuelve TRUE si esta pulsada la tecla
  588.                 END
  589.                 CASE agacharse:
  590.                     RETURN(key(_down));
  591.                 END
  592.                 CASE avanzar:
  593.                     IF (father.flags)   // Dependiendo hacia donde mire
  594.                         RETURN(key(_right));    // Lee una tecla...
  595.                     ELSE
  596.                         RETURN(key(_left));     // O la otra
  597.                     END
  598.                 END
  599.                 CASE retroceder:
  600.                     IF (father.flags)
  601.                         RETURN(key(_left));
  602.                     ELSE
  603.                         RETURN(key(_right));
  604.                     END
  605.                 END
  606.                 CASE golpear:
  607.                     RETURN(key(_control));
  608.                 END
  609.             END
  610.         END
  611.         CASE control_teclado2:      // Se esta usando el teclado 2
  612.             SWITCH(acción)          // Se comprueba igual que antes.
  613.                 CASE saltar:
  614.                     RETURN(key(_q));
  615.                 END
  616.                 CASE agacharse:
  617.                     RETURN(key(_a));
  618.                 END
  619.                 CASE avanzar:
  620.                     IF (father.flags)
  621.                         RETURN(key(_t));
  622.                     ELSE
  623.                         RETURN(key(_r));
  624.                     END
  625.                 END
  626.                 CASE retroceder:
  627.                     IF (father.flags)
  628.                         RETURN(key(_r));
  629.                     ELSE
  630.                         RETURN(key(_t));
  631.                     END
  632.                 END
  633.                 CASE golpear:
  634.                     RETURN(key(_x));
  635.                 END
  636.             END
  637.         END
  638.         CASE control_ordenador:         // Lo maneja el ordenador
  639.             dist=abs(id_luchador1.x-id_luchador2.x);      // Halla la distancia entre los muñecos
  640.             SWITCH(father.estado)       // Mira que se quiere comprobar
  641.  
  642.                 // Va mirando que acción se quiere hacer
  643.                 // Y se comprueba si es conveniente
  644.                 CASE _parado:
  645.                     SWITCH(acción)
  646.                         CASE saltar:
  647.                             // Si se esta a distancia correcta y...
  648.                             // da la suerte devuelve TRUE
  649.                             IF (dist<160 AND rand(0,35)==0)
  650.                                 RETURN(1);
  651.                             END
  652.                         END
  653.                         CASE agacharse: // Igual para las demás acciones
  654.                             IF (dist<160 AND rand(0,25)==0)
  655.                                 RETURN(1);
  656.                             END
  657.                         END
  658.                         CASE avanzar:
  659.                             IF (dist>400)
  660.                                 IF (rand(0,4)==0)
  661.                                     RETURN(1);
  662.                                 END
  663.                             ELSE
  664.                                 IF (dist>120 AND rand(0,8)==0)
  665.                                     RETURN(1);
  666.                                 END
  667.                             END
  668.                         END
  669.                         CASE retroceder:
  670.                             IF (dist<180 AND rand(0,25)==0)
  671.                                 RETURN(1);
  672.                             END
  673.                             IF (dist<80 AND rand(0,5)==0)
  674.                                 RETURN(1);
  675.                             END
  676.                         END
  677.                         CASE golpear:
  678.                             IF (dist<180 AND dist>60 AND rand(0,5)==0)
  679.                                 RETURN(1);
  680.                             END
  681.                         END
  682.                     END
  683.                 END
  684.                 CASE _avanzando:
  685.                     SWITCH(acción)
  686.                         CASE saltar:
  687.                             IF (dist>180 AND dist<300 AND rand(0,8)==0)
  688.                                 RETURN(1);
  689.                             END
  690.                         END
  691.                         CASE golpear:
  692.                             IF (dist<140)
  693.                                 RETURN(1);
  694.                             END
  695.                         END
  696.                     END
  697.                 END
  698.                 CASE _retrocediendo:
  699.                     SWITCH(acción)
  700.                         CASE saltar:
  701.                             IF (dist<120 AND rand(0,6)==0)
  702.                                 RETURN(1);
  703.                             END
  704.                         END
  705.                         CASE golpear:
  706.                             IF (dist>70 AND dist<150)
  707.                                 RETURN(1);
  708.                             END
  709.                         END
  710.                     END
  711.                 END
  712.                 CASE _agachado:
  713.                     SWITCH(acción)
  714.                         CASE agacharse:
  715.                             IF (rand(0,5)<>0)
  716.                                 RETURN(1);
  717.                             END
  718.                         END
  719.                         CASE golpear:
  720.                             IF (dist<180 AND rand(0,5)==0)
  721.                                 RETURN(1);
  722.                             END
  723.                         END
  724.                     END
  725.                 END
  726.                 CASE _saltando:
  727.                     SWITCH(acción)
  728.                         CASE golpear:
  729.                             IF (rand(0,10)==0)
  730.                                 RETURN(1);
  731.                             END
  732.                         END
  733.                     END
  734.                 END
  735.             END
  736.             // Si la acción es correcta se devuelve 1, si no 0
  737.             RETURN(0);  // No hace ninguna acción
  738.         END
  739.     END
  740. END
  741.  
  742. //------------------------------------------------------------------------------
  743. // Proceso muñeco
  744. // Maneja todos los tipo de muñeco
  745. // Entradas: 'x,y'          : Coordenadas iniciales
  746. //           'file'         : Fichero donde están los gráficos
  747. //           'flags'        : Hacia donde mira el muñeco (izq./der.)
  748. //           'tipo_control' : Quien maneja al muñeco (teclado1/teclado2/cpu)
  749. //           'luchador'     : Cual es de los dos luchadores
  750. //------------------------------------------------------------------------------
  751.  
  752. PROCESS muñeco(x,y,file,flags,tipo_control,luchador)
  753.  
  754. PRIVATE
  755.     nuevo_estado;       // Variable temporal para el estado del muñeco
  756.     nuevo_paso;         // Variable temporal para la posición de la animación del muñeco
  757.     golpe_x,golpe_y;    // Variables para guardar los puntos de control de los golpes
  758.     // Fuerza de cada uno de los golpes
  759.     fuerza_golpe[]=35,35,55,35,35;
  760.     contador0;          // Contador de uso general
  761.     suma_fuerza;        // Fuerza variable dependiendo del nivel y del luchador
  762.  
  763. BEGIN
  764.     ctype=c_scroll;     // Lo introduce dentro del scroll
  765.     energia=203;        // Inicializa la energía
  766.     FRAME;
  767.     sombra();           // Crea la sombra del muñeco
  768.  
  769.     IF (tipo_control<>0)                        // Si el ordenador no lleva este muñeco
  770.         IF (enemigo.tipo_control==0)            // Pero lleva el del enemigo
  771.             SWITCH(nivel)                       // Dependiendo del nivel de juego (dificultad)
  772.                 CASE 1: suma_fuerza=-10; END    // Hace que los golpes quiten menos energia
  773.                 CASE 2: suma_fuerza=-18; END
  774.             END
  775.         ELSE
  776.             suma_fuerza=10; // Humano vs Humano, iguala las fuerzas
  777.         END
  778.     END
  779.  
  780.     SWITCH(luchador)        // Dependiendo del tipo de luchador
  781.         CASE 0: suma_fuerza-=8; END // Ripley pega menos
  782.         CASE 1: suma_fuerza+=6; END // Bishop es el segundo que pega más
  783.         CASE 2: suma_fuerza+=4; END // Alien es el segundo que pega menos
  784.         CASE 3: suma_fuerza+=8; END // Nostrodomo pega más que nadie
  785.     END
  786.  
  787.     // Actualiza la fuerza de los golpes según los jugadores
  788.     FROM contador0=0 TO 4; fuerza_golpe[contador0]+=suma_fuerza; END
  789.  
  790.     LOOP
  791.         nuevo_estado=estado;    // Actualiza la variable temporal del estado del muñeco
  792.         SWITCH(estado)          // Comprueba el estado del muñeco
  793.             CASE _parado:
  794.                 graph=anim0[paso++];        // Anima el gráfico
  795.                 IF (paso==sizeof(anim0))    // Si no hay mas gráficos en la animación
  796.                     paso=0;                 // Empieza desde 0
  797.                 END
  798.                 IF (flags)                  // Hace que los muñecos se miren
  799.                     IF (enemigo.x<x) flags=0; END
  800.                 ELSE
  801.                     IF (enemigo.x>x) flags=1; END
  802.                 END
  803.                 // Comprueba si se quiere cambiar de estado
  804.                 IF (control(golpear))       // Comprueba si se quiere golpear
  805.                     nuevo_estado=_puñetazo; // Y golpea...
  806.                 END
  807.                 IF (control(saltar))        // Comprueba si se quiere saltar
  808.                     nuevo_estado=_saltando; // Y salta...
  809.                     inc_y=-16; inc_x=0;     // Inicializa los incrementos para el salto
  810.                 END
  811.                 IF (control(agacharse))     // Comprueba si se quiere agachar
  812.                     nuevo_estado=_agachándose;  // Y se agacha...
  813.                 END
  814.                 IF (control(retroceder))    // Comprueba si se quiere retroceder
  815.                     nuevo_estado=_retrocediendo;// Y retrocede...
  816.                 END
  817.                 IF (control(avanzar))       // Comprueba si se quiere avanzar
  818.                     nuevo_estado=_avanzando;// Y avanza...
  819.                 END
  820.             END
  821.  
  822.             CASE _avanzando:                // Si se esta avanzando
  823.                 graph=anim1[paso++];        // Anima el gráfico
  824.                 IF (paso==sizeof(anim1))    // Comprueba que no se ha llegado al final de la animación
  825.                     nuevo_estado=_parado;   // Y si se ha llegado cambia de estado
  826.                 END
  827.                 IF (flags)                  // Mueve el muñeco según donde mire
  828.                     x+=4;
  829.                 ELSE
  830.                     x-=4;
  831.                 END
  832.                 // Comprueba si se quieren hacer otras acciones
  833.                 IF (control(golpear))             // Se quiere golpear
  834.                     nuevo_estado=_patada_normal;
  835.                 END
  836.                 IF (control(saltar))              // Se quiere saltar
  837.                     nuevo_estado=_saltando;
  838.                     inc_y=-16;
  839.                     IF (flags)
  840.                         inc_x=12;
  841.                     ELSE
  842.                         inc_x=-12;
  843.                     END
  844.                 END
  845.             END
  846.  
  847.             CASE _retrocediendo:            // Mira si se esta retrocediendo
  848.                 graph=anim2[paso++];        // Anima el gráfico
  849.                 IF (paso==sizeof(anim2))    // Si se ha llegado al final
  850.                     nuevo_estado=_parado;   // Cambia de estado
  851.                 END
  852.                 IF (flags)                  // Lo mueve según a donde mire
  853.                     x-=4;
  854.                 ELSE
  855.                     x+=4;
  856.                 END
  857.                 // Se mira si se quieren hacer otras acciones posibles
  858.                 IF (control(golpear))
  859.                     nuevo_estado=_patada_giratoria;
  860.                     inc_y=-10;
  861.                 END
  862.                 IF (control(saltar))
  863.                     nuevo_estado=_saltando;
  864.                     inc_y=-16;
  865.                     IF (flags)
  866.                         inc_x=-8;
  867.                     ELSE
  868.                         inc_x=8;
  869.                     END
  870.                 END
  871.             END
  872.  
  873.             CASE _agachándose:  // Comprueba si se esta agachándose
  874.                 graph=anim3[paso++];        // Haz la animación
  875.                 IF (paso==sizeof(anim3))    // Hasta que se llegue al final
  876.                     nuevo_estado=_agachado; // Y pasa al estado de agachado
  877.                 END
  878.             END
  879.  
  880.             CASE _agachado:         // Comprueba si esta agachado
  881.                 graph=anim4[0];     // Pone el gráfico necesario
  882.                 IF (flags)          // Pone al gráfico mirando al otro
  883.                     IF (enemigo.x<x)
  884.                         flags=0;
  885.                     END
  886.                 ELSE
  887.                     IF (enemigo.x>x)
  888.                         flags=1;
  889.                     END
  890.                 END
  891.                 // Comprueba si se quiere hacer otras acciones
  892.                 IF (control(golpear))           // Comprueba si se quiere golpear
  893.                     nuevo_estado=_golpe_bajo;
  894.                 END
  895.                 IF (NOT control(agacharse))     // Si no quiere agacharse
  896.                     nuevo_estado=_levantándose; // Se pone levantándose
  897.                 END
  898.             END
  899.  
  900.             CASE _levantándose:     // Comprueba si esta levantándose
  901.                 graph=anim5[paso++];        // Anímalo
  902.                 IF (paso==sizeof(anim5))    // Si se acabado
  903.                     nuevo_estado=_parado;   // Cambia de estado a parado
  904.                 END
  905.             END
  906.  
  907.             CASE _saltando:             // Comprueba si se esta saltando
  908.                 graph=anim6[paso++];    // Anima los gráficos
  909.                 IF (paso>4)             // Si se ha llegado al punto de la animación
  910.                     x+=inc_x;           // Mueve al muñeco
  911.                     y+=inc_y*3;
  912.                     inc_y+=2;           // Cambia el incremento para que bote
  913.                     IF (y>=440)         // Comprueba si ha tocado el suelo
  914.                         y=440;
  915.                         polvo(x,y);     // Crea polvo cuando cae
  916.                         // Mira si se quiere saltar otra vez
  917.                         IF (control(saltar))
  918.                             nuevo_estado=_parado;
  919.                         ELSE
  920.                             nuevo_estado=_agachándose;
  921.                         END
  922.                     END
  923.                 END
  924.                 IF (control(golpear))       // Comprueba si se quiere golpear
  925.                     nuevo_estado=_patada_aérea;
  926.                     nuevo_paso=paso;
  927.                 END
  928.             END
  929.  
  930.             // Comprueba si se esta se hace el golpe bajo
  931.             CASE _golpe_bajo:
  932.                 graph=anim7[paso++];        // Anima el gráfico
  933.                 IF (paso==sizeof(anim7))    // Si se acaba la animación
  934.                     nuevo_estado=_agachado; // Se pone en otro estado
  935.                 END
  936.                 IF (flags)                  // Comprueba hacia donde mira
  937.                     x++;                    // Y se mueve un poco
  938.                 ELSE
  939.                     x--;
  940.                 END
  941.                 // Si se ha llegado al punto de la animación correcto
  942.                 IF (paso==2)
  943.                     sound(s_aire1,rand(50,75),256);         // Realiza sonido
  944.                     get_real_point(1,&golpe_x,&golpe_y);    // Coge los puntos de control del puño
  945.                     golpe(golpe_x,golpe_y,fuerza_golpe[0]); // Y comprueba si se ha tocado
  946.                     IF (fuerza_golpe[0]>2)  // Reduce la fuerza de golpe
  947.                         fuerza_golpe[0]--;  // para la próxima vez
  948.                     END
  949.                 END
  950.             END
  951.             // Comprueba si se esta haciendo la acción puñetazo
  952.             CASE _puñetazo:
  953.                 graph=anim8[paso++];        // Anima el gráfico
  954.                 IF (paso==sizeof(anim8))    // Hasta que se acabe la animación
  955.                     nuevo_estado=_parado;   // Y cambia a un nuevo estado
  956.                 END
  957.                 IF (flags)                  // Comprueba hacia donde mira
  958.                     x++;                    // Y se mueve
  959.                 ELSE
  960.                     x--;
  961.                 END
  962.                 IF (paso==4)    // Si se ha llegado al punto de la animación
  963.                     // Realiza el golpe
  964.                     sound(s_aire2,rand(50,75),256);
  965.                     get_real_point(1,&golpe_x,&golpe_y);    // Halla el punto donde se dara el golpe
  966.                     golpe(golpe_x,golpe_y,fuerza_golpe[1]); // Comprueba si se da el golpe
  967.                     IF (fuerza_golpe[1]>2)                  // Quita fuerza al golpe
  968.                         fuerza_golpe[1]--;
  969.                     END
  970.                 END
  971.             END
  972.  
  973.             CASE _patada_giratoria: // Comprueba la patada giratoria como los anteriores golpes
  974.                 graph=anim9[paso++];
  975.                 IF (paso==sizeof(anim9))
  976.                     nuevo_estado=_parado;
  977.                 END
  978.                 y+=inc_y; inc_y+=2;
  979.                 IF (y>440)
  980.                     y=440;
  981.                 END
  982.                 IF (paso==5)
  983.                     sound(s_aire3,rand(50,75),256);
  984.                     get_real_point(1,&golpe_x,&golpe_y);
  985.                     golpe(golpe_x,golpe_y,fuerza_golpe[2]);
  986.                     IF (fuerza_golpe[2]>2)
  987.                         fuerza_golpe[2]--;
  988.                     END
  989.                 END
  990.             END
  991.  
  992.             CASE _patada_normal:    // Comprueba la patada normal
  993.                 graph=anim10[paso++];
  994.                 IF (paso==sizeof(anim10))
  995.                     nuevo_estado=_parado;
  996.                 END
  997.                 IF (paso==4)
  998.                     sound(s_aire4,rand(50,75),256);
  999.                     get_real_point(1,&golpe_x,&golpe_y);
  1000.                     golpe(golpe_x,golpe_y,fuerza_golpe[3]);
  1001.                     IF (fuerza_golpe[3]>2)
  1002.                         fuerza_golpe[3]--;
  1003.                     END
  1004.                 END
  1005.             END
  1006.  
  1007.             CASE _patada_aérea:     // Comprueba la patada aérea
  1008.                 graph=anim11[paso++];
  1009.                 IF (paso>4)
  1010.                     x+=inc_x;
  1011.                     y+=inc_y*3;
  1012.                     inc_y+=2;
  1013.                     IF (y>=440)
  1014.                         y=440;
  1015.                         polvo(x,y);
  1016.                         IF (control(saltar))
  1017.                             nuevo_estado=_parado;
  1018.                         ELSE
  1019.                             nuevo_estado=_agachándose;
  1020.                         END
  1021.                     END
  1022.                 END
  1023.                 IF (paso==10 OR paso==19)
  1024.                     sound(s_aire5,rand(50,75),256);
  1025.                     get_real_point(1,&golpe_x,&golpe_y);
  1026.                     golpe(golpe_x,golpe_y,fuerza_golpe[4]);
  1027.                     IF (fuerza_golpe[4]>2)
  1028.                         fuerza_golpe[4]--;
  1029.                     END
  1030.                 END
  1031.             END
  1032.  
  1033.             CASE _tocado:   // Comprueba si el muñeco ha sido tocado
  1034.                 graph=anim12[paso++];       // anima el gráfico
  1035.                 IF (paso==sizeof(anim12))   // Hasta que acabe
  1036.                     // Haz un sonido al azar de los que tiene
  1037.                     SWITCH(rand(0,3))
  1038.                         CASE 0:
  1039.                             sound(s_golpe1,rand(25,50),256);
  1040.                         END
  1041.                         CASE 1:
  1042.                             sound(s_golpe2,rand(25,50),256);
  1043.                         END
  1044.                         CASE 2:
  1045.                            sound(s_golpe3,rand(25,50),256);
  1046.                         END
  1047.                     END
  1048.                     nuevo_estado=_parado;   // Cambia de estado
  1049.                     y=440;                  // Cae al suelo
  1050.                 END
  1051.                 x+=inc_x;      // Y mueve el muñeco un poco
  1052.                 // Si se movia el muñeco, lo frena
  1053.                 IF (inc_x<0)   // Si se movia a la izquierda
  1054.                     inc_x++;   // Se frena
  1055.                 END
  1056.                 IF (inc_x>0)   // Si se movia a la derecha
  1057.                     inc_x--;   // Se frena
  1058.                 END
  1059.                 IF (y<440)     // Si estaba saltando
  1060.                     y+=8;      // Hace que baje
  1061.                 END
  1062.                 IF (y>=440)    // Si estaba por debajo del limite inferior
  1063.                     y=440;     // Lo coloca
  1064.                 END
  1065.             END
  1066.  
  1067.             CASE _muerto:   // Comprueba si el muñeco ha muerto
  1068.                 IF (paso==0)
  1069.                 sound(s_muerto,25,256);     // Hace el sonido de cuando muere
  1070.                 END
  1071.                 graph=anim13[paso++];       // Anima el gráfico hacia con una secuencia
  1072.                 IF (paso==sizeof(anim13))   // Y la deja parada
  1073.                     paso--;
  1074.                 END
  1075.                 x+=inc_x;           // Mueve las coordenadas hasta cuadrarlas
  1076.                 // Como el caso anterior (tocado) frena el muñeco
  1077.                 IF (inc_x<0)
  1078.                     inc_x++;
  1079.                 END
  1080.                 IF (inc_x>0)
  1081.                     inc_x--;
  1082.                 END
  1083.                 IF (y<440)
  1084.                     y+=8;
  1085.                 END
  1086.                 IF (y>=440)
  1087.                     y=440;
  1088.                 END
  1089.             END
  1090.  
  1091.         END
  1092.  
  1093.         IF (estado<>nuevo_estado)   // Actualiza el estado del muñeco
  1094.             estado=nuevo_estado;
  1095.             paso=nuevo_paso;        // Y el paso dentro de la animación
  1096.             nuevo_paso=0;
  1097.         END
  1098.  
  1099.         IF (x<60)                   // Comprueba que no se ha salido de pantalla
  1100.             x=60;                   // Y coloca el gráfico si ha salido
  1101.         END
  1102.         IF (x>900)
  1103.             x=900;
  1104.         END
  1105.  
  1106.         FRAME;
  1107.     END
  1108. END
  1109.  
  1110. //------------------------------------------------------------------------------
  1111. // Proceso sombra
  1112. // Maneja la sombra de los muñecos
  1113. //------------------------------------------------------------------------------
  1114.  
  1115. PROCESS sombra()
  1116.  
  1117. BEGIN
  1118.     ctype=c_scroll; // Lo pone dentro del scroll
  1119.     graph=1;        // Elige el gráfico
  1120.     priority=-1;    // Le da prioridad baja para que se ejecute después
  1121.     z=1;            // Lo pone por debajo del gráfico del muñeco
  1122.     y=440;          // Inicializa la coordenada vertical
  1123.     flags=4;        // Y hace que sea transparente
  1124.     LOOP
  1125.         x=father.x; // Hace que siga al muñeco
  1126.         FRAME;
  1127.     END
  1128. END
  1129.  
  1130. //------------------------------------------------------------------------------
  1131. // Proceso Polvo
  1132. // Pone una nube de polvo cuando el muñeco cae del salto
  1133. // Entradas: Coordenadas donde ira el gráfico
  1134. //------------------------------------------------------------------------------
  1135.  
  1136. PROCESS polvo(x,y)
  1137.  
  1138. BEGIN
  1139.     FRAME;
  1140.     ctype=c_scroll; // Lo pone dentro del scroll
  1141.     flags=4;        // Lo hace transparente
  1142.     z=-1;           // Lo pone por delante del muñeco
  1143.     FROM graph=2 TO 12;// Anima el gráfico
  1144.         FRAME;
  1145.     END             // Acaba, eliminando este proceso
  1146. END
  1147.  
  1148. //------------------------------------------------------------------------------
  1149. // Proceso golpe
  1150. // Maneja los golpes que lanzan los muñecos
  1151. // Entradas: Coordenadas de donde se da realmente el golpe
  1152. //           'daño' Energía que quita al enemigo
  1153. //------------------------------------------------------------------------------
  1154.  
  1155. PROCESS golpe(x,y,daño)
  1156.  
  1157. PRIVATE
  1158.     id_muñecos; // Identificador a los muñecos
  1159.     contador0;  // Contador de uso general
  1160.  
  1161. BEGIN
  1162.     ctype=c_scroll;     // Introduce al proceso dentro del scroll
  1163.     z=-1;               // Lo pone por delante de los muñecos
  1164.     graph=100;          // Elige el gráfico de una bola para abarcar mas
  1165.     // Comprueba si esta tocando a un muñeco
  1166.     id_muñecos=collision(type muñeco);
  1167.     IF (id_muñecos==father)      // Y que no sea él mismo que llamo a este proceso
  1168.         id_muñecos=collision(type muñeco);  // Si es el mismo intenta coger el otro identificador
  1169.     END
  1170.  
  1171.     IF (id_muñecos)              // Si ha tocado
  1172.         // Hace un sonido al azar de los disponibles
  1173.         SWITCH (rand(0,2))
  1174.             CASE 0:
  1175.                 sound(s_tocado1,rand(25,75),256);
  1176.             END
  1177.             CASE 1:
  1178.                 sound(s_tocado2,rand(25,75),256);
  1179.             END
  1180.             CASE 2:
  1181.                 sound(s_tocado3,rand(25,75),256);
  1182.             END
  1183.         END
  1184.         id_muñecos.paso=0;               // Actualiza la animación del que ha sido tocado
  1185.         id_muñecos.energia-=daño/2;      // Le quita energía
  1186.         IF (id_muñecos.energia<=0)       // Si no le queda energía
  1187.             id_muñecos.energia=0;        // Es que esta muerto
  1188.             id_muñecos.estado=_muerto;
  1189.             estado_juego=2;
  1190.         ELSE
  1191.             id_muñecos.estado=_tocado;   // Si no, esta simplemente tocado
  1192.         END
  1193.         IF (id_muñecos.flags)            // Mueve el gráfico un poco para atrás
  1194.             id_muñecos.inc_x=-8;
  1195.         ELSE
  1196.             id_muñecos.inc_x=8;
  1197.         END
  1198.         SWITCH(sangre)          // Crea la sangre
  1199.             // Dependiendo del nivel elegido en las opciones
  1200.             CASE 0:     // Golpe sin sangre
  1201.                 golpe_sin_sangre(x,y);
  1202.             END
  1203.             CASE 1:     // Golpe con sangre
  1204.                 contador0=daño/3+1;
  1205.                 WHILE (contador0>0)
  1206.                     particula_sangre(x,y,id_muñecos.inc_x+rand(-2,2),rand(-4,0),rand(10,20));
  1207.                     contador0--;
  1208.                 END
  1209.             END
  1210.             CASE 2:    // Golpe con mucha sangre
  1211.                 contador0=daño+2;
  1212.                 WHILE (contador0>0)
  1213.                     particula_sangre(x,y,id_muñecos.inc_x*2+rand(-4,4),rand(-8,2),rand(15,30));
  1214.                     contador0--;
  1215.                 END
  1216.             END
  1217.         END
  1218.     END
  1219. END
  1220.  
  1221. //------------------------------------------------------------------------------
  1222. // Proceso particula_sangre
  1223. // Maneja la sangre que sale cuando se da un golpe
  1224. // Entradas: 'x,y'        : Coordenadas desde donde sale la sangre
  1225. //           'inc_x,inc_y': Incrementos en el movimiento de la sangre (caída)
  1226. //           'cont_tiempo': Contador del tiempo que aparecerá la sangre
  1227. //------------------------------------------------------------------------------
  1228.  
  1229. PROCESS particula_sangre(x,y,inc_x,inc_y,cont_tiempo)
  1230.  
  1231. BEGIN
  1232.     ctype=c_scroll;         // Lo pone dentro del scroll
  1233.     // Si esta en el modo de mayor sanguinolencia, espera un poco para que no salga toda junta
  1234.     IF (sangre==2)
  1235.         FRAME(rand(0,400)); // Espera un tiempo al azar
  1236.     END
  1237.     graph=rand(50,53);      // Elige uno de los gráficos disponibles al azar
  1238.     flags=4;                // La hace transparente
  1239.     z=-2;                   // Lo pone por encima de todo
  1240.     WHILE (cont_tiempo>0)   // Mueve la sangre mientras hjaya tiempo
  1241.         x+=inc_x;           // Realiza los incrementos en las coordenadas
  1242.         y+=inc_y;
  1243.         inc_y++;            // Hace que cada vez caiga más rapido
  1244.         IF (inc_x>0)        // Pero a horizontalmente se mueva más lento
  1245.             inc_x--;
  1246.         END
  1247.         IF (inc_x<0)
  1248.             inc_x++;
  1249.         END
  1250.         IF (y>410)          // Comprueba si ha tocado el suelo
  1251.             // Deja sangre pegada al suelo de forma aleatoria
  1252.             IF (rand(0,80)==0 AND sangre_total<50 AND y<480)
  1253.                 z=256;          // La pone detrás
  1254.                 sangre_total++; // Incrementa el contador de sangre
  1255.                 LOOP
  1256.                     FRAME;      // La deja en un bucle para que quede en pantalla
  1257.                 END
  1258.             END
  1259.         END
  1260.         cont_tiempo--;          // Incrementa el contador de tiempo
  1261.         FRAME;
  1262.     END
  1263. END
  1264.  
  1265. //------------------------------------------------------------------------------
  1266. // Proceso golpe_sin_sangre
  1267. // Pone un gráfico alternativo al de la sangre para los modos sin ella
  1268. //------------------------------------------------------------------------------
  1269.  
  1270. PROCESS golpe_sin_sangre(x,y)
  1271.  
  1272. BEGIN
  1273.     ctype=c_scroll; // Lo pone dentro del scroll
  1274.     z=-2;           // Por delante de otros gráficos
  1275.     FROM graph=60 TO 66;
  1276.         FRAME;      // Anima el gráfico
  1277.     END
  1278. END
  1279.  
  1280. //------------------------------------------------------------------------------
  1281. // Proceso objetos
  1282. // Pone los gráficos estáticos del marcador y la pantalla de opciones
  1283. // Entradas: fichero gráfico, coordenadas, gráfico, bandera (der/izq.),
  1284. //           zona de la pantalla
  1285. //------------------------------------------------------------------------------
  1286.  
  1287. PROCESS objetos(file,x,y,graph,flags,region)
  1288.  
  1289. BEGIN
  1290.     z=10;   // Lo pone por debajo de otros gráficos
  1291.     LOOP
  1292.         FRAME;
  1293.     END
  1294. END
  1295.  
  1296. //------------------------------------------------------------------------------
  1297. // Proceso crea_estrellas
  1298. // Maneja las estrellas que indican los combates ganados
  1299. //------------------------------------------------------------------------------
  1300.  
  1301. PROCESS crea_estrellas()
  1302.  
  1303. BEGIN
  1304.     // Elimina cualquier estrella que hubiera antes
  1305.     signal(type estrella,s_kill);
  1306.  
  1307.     // Pon las estrellas del jugador 1
  1308.     SWITCH(combates1)
  1309.         // Dependiendo de los combates ganados pone  unas estrellas u otras
  1310.         CASE 0:
  1311.             estrella(111,84,203);
  1312.             estrella(143,84,203);
  1313.         END
  1314.         CASE 1:
  1315.             estrella(111,84,204);
  1316.             estrella(143,84,203);
  1317.         END
  1318.         CASE 2:
  1319.             estrella(111,84,204);
  1320.             estrella(143,84,204);
  1321.         END
  1322.     END
  1323.  
  1324.     // Pon las estrellas del jugador 2
  1325.     SWITCH(combates2)
  1326.         CASE 0:
  1327.             estrella(530,84,203);
  1328.             estrella(498,84,203);
  1329.         END
  1330.         CASE 1:
  1331.             estrella(530,84,204);
  1332.             estrella(498,84,203);
  1333.         END
  1334.         CASE 2:
  1335.             estrella(530,84,204);
  1336.             estrella(498,84,204);
  1337.         END
  1338.     END
  1339.  
  1340. END
  1341.  
  1342. //------------------------------------------------------------------------------
  1343. // Proceso estrella
  1344. // Imprime los gráficos de la estrellas
  1345. // Entradas: Coordenadas y tipo de gráfico de la estrella
  1346. //------------------------------------------------------------------------------
  1347.  
  1348. PROCESS estrella(x,y,graph)
  1349.  
  1350. BEGIN
  1351.     LOOP
  1352.         FRAME;  // Lo imprime
  1353.     END
  1354. END
  1355.  
  1356. //------------------------------------------------------------------------------
  1357. // Proceso créditos
  1358. // Pone la pantalla de créditos
  1359. //------------------------------------------------------------------------------
  1360.  
  1361. PROCESS créditos()
  1362.  
  1363. PRIVATE
  1364.     codigo_mapa;    // Identificador al fichero de gráficos
  1365.     // Textos de los créditos
  1366.     textos[]=
  1367.         "PROGRAMADOR","DANIEL NAVARRO","",
  1368.         "GRAFISTAS","JOSE FERNANDEZ","RAFAEL BARRASO","",
  1369.         "SONIDOS","ANTONIO MARCHAL","",
  1370.         "JUGABILIDAD","LUIS F. FERNANDEZ","",
  1371.         "AGRADECIMIENTOS","FERNANDO PEREZ",
  1372.         "JORGE SANCHEZ","JAVIER CARRION","",
  1373.         "FOSTIATOR","DIV GAMES STUDIO";
  1374.  
  1375. BEGIN
  1376.     // Carga la pantalla de fondo
  1377.     codigo_mapa=load_map("fostiato\creditos.map");
  1378.     load_pal("fostiato\creditos.map");
  1379.     // Y el tipo de letras
  1380.     load_fnt("fostiato\creditos.fnt");
  1381.     put_screen(0,codigo_mapa);          // Pone el fondo
  1382.     FROM y=0 TO 19;                     // Y escribe los textos
  1383.         write(3,320,40+y*20,4,textos[y]);
  1384.     END
  1385.     fade_on();                          // Enciende la pantalla
  1386.     scan_code=0;
  1387.     REPEAT                              // Espera hasta que se pulse una tecla
  1388.         FRAME;
  1389.     UNTIL (scan_code<>0)
  1390. END
  1391.  
  1392. //------------------------------------------------------------------------------
  1393. // Proceso intro
  1394. // Realiza la intro del juego
  1395. //------------------------------------------------------------------------------
  1396.  
  1397. PROCESS intro();
  1398.  
  1399. PRIVATE
  1400.     contador0;      // Contador de uso general
  1401.     codigo_mapa;    // Identificador para descargar los graficos
  1402.     s_intro;        // Identificador del sonido de la intro
  1403. BEGIN
  1404.     // Para el proceso general para poner este
  1405.     signal(father,s_sleep);
  1406.     // Hace que la pantalla cambie rapido
  1407.     set_fps(100,0);
  1408.     load_pal("fostiato\intro.map");                 // Carga la paleta de colores
  1409.     codigo_mapa=load_map("fostiato\intro.map");     // Carga la pantalla
  1410.     s_intro=load_pcm("fostiato\introhit.pcm",0);    // Carga el sonido
  1411.  
  1412.     fade(200,200,200,8);        // Pone la pantalla en blanco
  1413.     WHILE (fading) FRAME; END   // Espera hasta que se encienda la pantalla
  1414.     sound(s_intro,100,256);     // Hace el sonido
  1415.     put_screen(0,codigo_mapa);  // Pone el fondo de pantalla
  1416.     unload_map(codigo_mapa);    // Descarga el grafico
  1417.     fade_on();                  // Hace que se vea la pantalla (la enciende)
  1418.     WHILE (fading) FRAME; END   // Espera hasta que se encienda la pantalla
  1419.  
  1420.     // Carga sonidos
  1421.     s_golpe1=load_pcm("fostiato\uah00.pcm",0);
  1422.     s_golpe2=load_pcm("fostiato\whimper2.pcm",0);
  1423.     s_golpe3=load_pcm("fostiato\whimper3.pcm",0);
  1424.     s_tocado1=load_pcm("fostiato\hit00.pcm",0);
  1425.     s_tocado2=load_pcm("fostiato\hit01.pcm",0);
  1426.     s_tocado3=load_pcm("fostiato\hit02.pcm",0);
  1427.     s_aire1=load_pcm("fostiato\turn06.pcm",0);
  1428.     s_aire2=load_pcm("fostiato\turn07.pcm",0);
  1429.     s_aire3=load_pcm("fostiato\turn08.pcm",0);
  1430.     s_aire4=load_pcm("fostiato\turn05.pcm",0);
  1431.     s_aire5=load_pcm("fostiato\turn09.pcm",0);
  1432.     s_muerto=load_pcm("fostiato\aaah01.pcm",0);
  1433.  
  1434.     // Carga los graficos y las letras
  1435.     load_fpg("fostiato\juego.fpg");
  1436.     load_fnt("fostiato\enjuego.fnt");
  1437.     load_fnt("fostiato\enjuego2.fnt");
  1438.  
  1439.     // Espera a que se pulse una tecla o pase un tiempo
  1440.     WHILE (NOT key(_esc) AND NOT key (_space) AND contador0<200)
  1441.         FRAME;
  1442.         contador0++;
  1443.     END
  1444.     // Devuelve el control al proceso principal
  1445.     signal(father,s_wakeup);
  1446. END
  1447.  
  1448.